package com.liyunc.demo.detect.camera;

import com.liyunc.demo.detect.service.DetectService;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;

import javax.swing.JFrame;

/**
 * 检测人脸并认证人脸，返回认证信息.
 */
public class PreviewCameraWithDetectAndIdentify extends AbstractCameraApplication {

    protected CanvasFrame previewCanvas;

    // 检测工具接口
    private final DetectService detectService;

    /**
     * 不同的检测工具，可以通过构造方法传入.
     *
     * @param detectService 人脸认证服务
     */
    public PreviewCameraWithDetectAndIdentify(DetectService detectService) {
        this.detectService = detectService;
    }

    @Override
    protected void initOutput() throws Exception {
        previewCanvas = new CanvasFrame("camera preview and identify",
                CanvasFrame.getDefaultGamma());
        previewCanvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        previewCanvas.setAlwaysOnTop(true);

        // 检测服务初始化操作
        detectService.init();
    }

    @Override
    protected void output(Frame frame) {
        // 原始帧先交给检测服务处理，这个处理包括物体检测，再将检测结果标注在原始图片上，
        // 然后转换为帧返回
        Frame detectedFrame = detectService.convert(frame);
        // 预览窗口上显示的帧是标注了检测结果的帧
        previewCanvas.showImage(detectedFrame);

    }

    @Override
    protected void releaseOutputResource() throws Exception {
        if (null != previewCanvas) {
            previewCanvas.dispose();
        }

        // 检测服务释放资源
        detectService.releaseResource();
    }

    /**
     * 检测有些耗时，所以两帧之间的间隔时间要低于普通预览.
     *
     * @return 帧间隔时间（秒）
     */
    @Override
    protected int getInterval() {
        final int i = 8;
        return super.getInterval() / i;
    }
}
